#include "checkclisocket.h"
#include "ui_checkclisocket.h"
#include <QDebug>
#include <QMessageBox>

checkclisocket::checkclisocket(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::checkclisocket),
    tcpSocket(new QTcpSocket(this))
{
    // 初始化UI界面（加载.ui文件定义的控件）
    ui->setupUi(this);

    // 设置窗口标题
    setWindowTitle("网络连接工具");

    // 关联按钮点击信号到自定义槽函数
    connect(ui->pushButton, &QPushButton::clicked, this, &checkclisocket::onConnectButtonClicked);      // 连接按钮
    connect(ui->pushButton_2, &QPushButton::clicked, this, &checkclisocket::onDisconnectButtonClicked); // 断开按钮

    // 关联TCP套接字信号到槽函数
    connect(tcpSocket, &QTcpSocket::connected, this, &checkclisocket::onConnected);
    connect(tcpSocket, &QTcpSocket::disconnected, this, &checkclisocket::onDisconnected);
    connect(tcpSocket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),
            this, &checkclisocket::onErrorOccurred);
}

// 连接按钮点击事件
void checkclisocket::onConnectButtonClicked()
{
    // 获取UI输入的IP地址和端口号
    QString ipAddress = ui->lineEdit->text().trimmed();    // 地址输入框（对应.ui中的lineEdit）
    QString portText = ui->lineEdit_2->text().trimmed();   // 端口输入框（对应.ui中的lineEdit_2）

    // 校验输入合法性
    if (ipAddress.isEmpty() || portText.isEmpty()) {
        QMessageBox::warning(this, "输入错误", "请填写IP地址和端口号！");
        return;
    }

    bool isPortValid;
    quint16 port = portText.toUShort(&isPortValid);
    if (!isPortValid || port < 1 || port > 65535) {
        QMessageBox::warning(this, "输入错误", "请填写有效的端口号（1-65535）！");
        return;
    }

    // 如果已连接，则先断开
    if (tcpSocket->state() == QAbstractSocket::ConnectedState) {
        tcpSocket->disconnectFromHost();
    }

    // 发起连接
    if (tcpSocket->state() == QAbstractSocket::UnconnectedState) {
        qDebug() << "正在连接到" << ipAddress << ":" << port;
        tcpSocket->connectToHost(ipAddress, port);
    }
}

// 断开按钮点击事件
void checkclisocket::onDisconnectButtonClicked()
{
    if (tcpSocket->state() == QAbstractSocket::ConnectedState) {
        tcpSocket->disconnectFromHost();
        qDebug() << "正在断开连接...";
    } else {
        QMessageBox::information(this, "提示", "未处于连接状态，无需断开！");
    }
}

// 连接成功回调
void checkclisocket::onConnected()
{
    // 这里假设你有 MainWindow 类，根据实际情况调整
    // 例如，创建 MainWindow 实例并显示，同时隐藏当前 Netsocket 窗口
    MainWindow *mainWindow = new MainWindow();
    // 如果 MainWindow 需要使用 tcpSocket，可传递过去，这里假设 MainWindow 有 setTcpSocket 方法
    mainWindow->setTcpSocket(tcpSocket);
    mainWindow->show();
    this->hide();
}

// 断开连接回调
void checkclisocket::onDisconnected()
{
    qDebug() << "❌ 已与服务器断开连接";
    QMessageBox::information(this, "已断开连接", "已与服务器断开连接！");
}

// 网络错误回调
void checkclisocket::onErrorOccurred(QAbstractSocket::SocketError error)
{
    QString errorMsg = tcpSocket->errorString(); // 获取具体错误信息
    qDebug() << "❌ 网络错误：" << errorMsg;
    QMessageBox::critical(this, "连接失败", "错误信息：" + errorMsg);
}

checkclisocket::~checkclisocket()
{
    delete ui;
}

